<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <!--  
        1. 位运算符
            所有的位运算都是二进制运算
                            运算符         运算规则
            按位与             &           一个为0即为0,否则为1
            按位或             |           一个为1即为1,否则为0
            按位异或           ^           相异为1,相同为0
            按位取反           ~           ~x = -x-1
            左移               <<          左移n位,低位补0
            右移               >>          右移n位,整数:高位补0
                                                   负数:高位补1
                               >>>         右移n位,高位补0,带符号(最高位是符号位,0:正,1:负)
            注意:
            * 了解原码,反码,补码
            *
            * << 和 >> 和 >>> 的正数位移:
            *                           1. 求原码
            *                           2. 左右位移
            * << 和 >> 的负数位移:
            *                    1. 求补码
            *                    2. 左右位移
            *                    3. 减1
            *                    4. 求反码
            *                    5. 加符号位
            * >>> 的负数位移:
            *               1. 求补码
            *               2. 左右位移
    -->
    <script>
        /*
            1001        1110
            1100        1100
            ----        ----
            1000        1100
         */
        console.log( 0b1001 & 0b1100);
        console.log( 0b1110 & 0b1100);
        /*
            1001        1110
            1100        1100
            ----        ----
            1101        1110
         */
        console.log( 0b1001 | 0b1100);
        console.log( 0b1110 | 0b1100);
        /*
            1001        1110
            1100        1100
            ----        ----
            0101        1110
         */
        console.log( 0b1001 ^ 0b1100);
        console.log( 0b1110 ^ 0b1100);
        var x = 10; // -10 - 1
        var x = -10;// --10 - 1
        console.log( ~x );
        console.log('------------- 分隔符 --------------');
        // 原码,反码,补码(32位)
        // 正数的原码,反码,补码都是一样的
        // 负数的原码,反码,补码如下显示
        // 
        // 整数:38
        // 原码:00000000000000000000000000100110(38的二进制)
        // 反码:11111111111111111111111111011001(0变1,1变0)
        // 补码:11111111111111111111111111011010(反码+1)
        
        var x = 38;
        console.log(x << 1);
        // 原码:00000000000000000000000000100110
        // 左移:00000000000000000000000001001100 = 76
        var x = 38;
        console.log(x >> 1);
        // 原码:00000000000000000000000000100110
        // 原码:00000000000000000000000000010011 = 19
        var x = -38;
        console.log(x << 1);
        // 原码:00000000000000000000000000100110
        // 反码:11111111111111111111111111011001
        // 补码:11111111111111111111111111011010
        // 左移:11111111111111111111111110110100
        // -1:  11111111111111111111111110110011
        // 反码:00000000000000000000000001001100 = -76(补上符号)
        var x = -38;
        console.log(x >>> 1);
    </script>
    <!--  
        2. 其余运算符
            void
                意思:无效的,空白的
                可理解为:没有返回值 或 undefined
                格式:void 变量
                格式:void (变量)    (推荐)
                应用场景:"禁止超链接的刷新"
            new
                意思:实例化
                格式:new 对象
                应用场景:面向对象时使用
    -->
    <script>
        // void
        var x = 10;
        console.log( void x);
        console.log( void (x));
    </script>
    <!-- 禁止超链接 -->
    <a href="http://www.baidu.com">baidu</a>
    <a href="javascript:void(0)">baidu</a>
    <script>
        // new
        var x = 10;
        var y = new Number(10);
        console.log(x);
        console.log(y);
        console.log(x + y);
        console.log(x == y);
        console.log(x === y);
    </script>
</body>
</html>